clear
clc

%% 1
% Создать радиальную базисную сеть с нулевой ошибкой для обучающей
% последовательности P = 0:3 и T = [0.0 2.0 4.1 5.9], проанализировать
% структурную схему построенной сети и значения параметров ее
% вычислительной модели

% параметры сети
P = 0:3;                  % коэффициенты весов 1го слоя
T = [0.0, 2.0, 4.1, 5.9]; % коэффициенты весов 2го слоя

% создание радиальной базисной сети с нулевой ошибкой
net = newrbe(P, T);

% генерация сети в Simulink
gensim(net);

% моделирование сети
plot(P, T, 'o-g', 'MarkerSize', 10, 'LineWidth', 2)
title('Modeling network; net = newrbe(P, T); P = 0:3; T = [0.0 2.0 4.1 5.9]');
xlabel('input'); ylabel('output');
hold on
V = sim(net, P);
plot(P, V, '+--b', 'MarkerSize', 10, 'LineWidth', 2)
P1 = 0.5:2.5;
Y = sim(net, P1);
plot(P1, Y, '.-.k', 'MarkerSize', 15, 'LineWidth', 2)
legend('T(P); P = 0:3; T = [0.0, 2.0, 4.1, 5.9]',...
       'V(P); P = 0:3; V = sim(net, P)',...
       'Y(P1); P1 = 0.5:2.5; Y = sim(net, P1)', 0)
hold off

%% 2
% Создать радиальную базисную сеть для обучающей последовательности
% P = 0:3 и T = [0.0 2.0 4.1 5.9] при средней квадратичной ошибке 0.1,
% проанализировать структурную схему построенной сети и значения параметров
% ее вычислительной модели

% % параметры сети
% P = 0:3;                  % коэффициенты весов 1го слоя
% T = [0.0, 2.0, 4.1, 5.9]; % коэффициенты весов 2го слоя
% 
% % создание радиальной базисной сети с средней квадратичной ошибкой 0.1
% net = newrb(P, T, 0.1);
% 
% % генерация сети в Simulink
% gensim(net);
% 
% % моделирование сети
% plot(P, T, 'o-g', 'MarkerSize', 10, 'LineWidth', 2)
% title('Modeling network; net = newrb(P, T, 0.1); P = 0:3; T = [0.0, 2.0, 4.1, 5.9]');
% xlabel('input'); ylabel('output');
% hold on
% V = sim(net, P);
% plot(P, V, '+--b', 'MarkerSize', 10, 'LineWidth', 2)
% P1 = 0.5:2.5;
% Y = sim(net, P1);
% plot(P1, Y, '.-.k', 'MarkerSize', 15, 'LineWidth', 2)
% legend('T(P); P = 0:3; T = [0.0, 2.0, 4.1, 5.9]',...
%        'V(P); P = 0:3; V = sim(net, P)',...
%        'Y(P1); P1 = 0.5:2.5; Y = sim(net, P1)', 0)
% hold off

%% 3
% Создать радиальную базисную сеть с нулевой ошибкой для большого числа
% значений входа и цели

% % задаем обучающую последовательность и строим для нее график
% P = -1:0.1:1;
% T = [ -0.9602 -0.5770 -0.0729  0.3771  0.6405  0.6600  0.4609 ...
%        0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647  0.988  ...
%        0.3072  0.3960  0.3449  0.1816 -0.0312 -0.2189 -0.3201 ];
% 
% % создаем сеть и определяем число нейронов в слоях
% net = newrbe(P, T);
% 
% % моделирование сети
% plot(P, T, 'o-g', 'MarkerSize', 10, 'LineWidth', 2)
% title([ 'Modeling network; net = newrb(P, T); P = -1:0.1:1;', ...
%         'T = [-0.9602, -0.5770, -0.0729,  0.3771,...]' ]);
% xlabel('input'); ylabel('output');
% hold on
% V = sim(net, P);
% plot(P, V, '+--b', 'MarkerSize', 10, 'LineWidth', 2)
% P1 = [-0.75, -0.25, 0.25, 0.75];
% Y = sim(net, P1);
% plot(P1, Y, '.-.k', 'MarkerSize', 15, 'LineWidth', 2)
% legend('T(P); P = -1:0.1:1; T = [-0.9602, -0.5770, -0.0729,  0.3771,...]',...
%        'V(P); P = -1:0.1:1; V = sim(net, P)',...
%        'Y(P1); P1 = [-0.75, -0.25, 0.25, 0.75]; Y = sim(net, P1)', 0)
% hold off

%% 4
% Создать радиальную базисную сеть для большого числа значений входа и цели
% при средней квадратичной ошибке 0.01

% % задаем обучающую последовательность и строим для нее график
% P = -1:0.1:1;
% T = [ -0.9602 -0.5770 -0.0729  0.3771  0.6405  0.6600  0.4609 ...
%        0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647  0.988  ...
%        0.3072  0.3960  0.3449  0.1816 -0.0312 -0.2189 -0.3201 ];
% 
% % создаем сеть и определяем число нейронов в слоях
% net = newrb(P, T, 0.01);
% 
% % моделирование сети
% plot(P, T, 'o-g', 'MarkerSize', 10, 'LineWidth', 2)
% title([ 'Modeling network; net = newrb(P, T, 0.01); P = -1:0.1:1;', ...
%         ' T = [-0.9602, -0.5770, -0.0729,  0.3771,...]' ]);
% xlabel('input'); ylabel('output');
% hold on
% V = sim(net, P);
% plot(P, V, '+--b', 'MarkerSize', 10, 'LineWidth', 2)
% P1 = [-0.75 -0.25 0.25 0.75];
% Y = sim(net, P1);
% plot(P1, Y, '.-.k', 'MarkerSize', 15, 'LineWidth', 2)
% legend('T(P); P = -1:0.1:1; T = [-0.9602, -0.5770, -0.0729,  0.3771,...]',...
%        'V(P); P = -1:0.1:1; V = sim(net, P)',...
%        'Y(P1); P1 = [-0.75, -0.25, 0.25, 0.75]; Y = sim(net, P1)', 0)
% hold off

%% 5
% Провести аппроксимацию функции f(x)

% P  = -3:0.1:3;
% a1 = radbas(P);
% a2 = radbas(P-1.5);
% a3 = radbas(P+2);
% a  = a1 + a2 + 0.5*a3;
% plot(P, a1, P, a2, P, 0.5*a3, P, a);
% title('Approximation f(x); P = -3:0.1:3');
% xlabel('P'); ylabel('a');
% legend('a1(P); a1 = radbas(P)',...
%        'a2(P); a2 = radbas(P-1.5)',...
%        '0.5*a3(P); a3 = radbas(P+2)',...
%        'a(P); a = a1 + a2 + 0.5*a3', 0)

%% 6
% Исследовать гладкость аппроксимации при следующих значениях параметра 
% SPREAD: 1, 0.01 и 12.

% % задаем обучающую последовательность и строим для нее график
% P = -1:0.1:1;
% T = [ -0.9602 -0.5770 -0.0729  0.3771  0.6405  0.6600  0.4609 ...
%        0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647  0.988  ...
%        0.3072  0.3960  0.3449  0.1816 -0.0312 -0.2189 -0.3201 ];
%    
% P1 = [-0.75 -0.25 0.25 0.75];
% 
% SPREAD = [1, 0.01, 12];
% 
% for i = 1 : length(SPREAD)
%     % создаем сеть и определяем число нейронов в слоях
%     net = newrb(P, T, SPREAD(i));
%     
%     % моделирование сети
%     figure(i)
%     plot(P, T, 'o-g', 'MarkerSize', 10, 'LineWidth', 2)
%     title(['Modeling network; net = newrb(P, T, ', num2str(SPREAD(i)), ...
%            '); P = -1:0.1:1; T = [-0.9602, -0.5770, -0.0729,  0.3771,...]']);
%     xlabel('input'); ylabel('output');
%     
%     hold on
%     V = sim(net, P);
%     plot(P, V, '+--b', 'MarkerSize', 10, 'LineWidth', 2)
%     Y = sim(net, P1);
%     plot(P1, Y, '.-.k', 'MarkerSize', 15, 'LineWidth', 2)
%     legend('T(P); P = -1:0.1:1; T = [-0.9602, -0.5770, -0.0729,  0.3771,...]',...
%            'V(P); P = -1:0.1:1; V = sim(net, P)',...
%            'Y(P1); P1 = [-0.75, -0.25, 0.25, 0.75]; Y = sim(net, P1)', 0)
%     hold off
% end
